// 给定一个字符串表达式s，表达式中所有整数为非负整数，运算符还有+-*/没有括号，实现一个基本计算器来计算并返回它的值

// 思路：堆栈，遇到加或减，把对应的值入栈，遇到乘或除，需要把运算后的结果入栈，处理完当前的值后需要更新下一个操作符和统计当前数值
// 时间复杂度：O(n)，n是字符串的长度
// 空间复杂度：O(n)，stack的大小
function calculate(str) {
    let num = 0
    let opr = '+'
    let stack = []
    for (let i = 0; i < str.length; i++) {
        if (str[i] >= '0') {
            num = num * 10 + Number(str[i])
        }
        if (Number.isNaN(Number(str[i])) || i === str.length - 1) {
            switch (opr) {
                case '+':
                    stack.push(num)
                    break;
                case '-':
                    stack.push(-num)
                    break;
                case '*':
                    stack.push(stack.pop() * num)
                    break;
                case '/':
                    // 用math.floor在负数的情况下向下取值不能保留整数部分
                    // stack.push(Math.floor(stack.pop() / num)) 
                    stack.push((stack.pop() / num) | 0)
                    break;
                default:
                    break;
            } 
            opr = str[i]
            num = 0
        }
    }
    return stack.reduce((pre, cur) => pre + cur)
}

s = "14-3/2"
console.log(calculate(s));